49. 数据框可视化

本章概要

  • 学习材料:含类别、连续指标和相关变量的DataFrame。
  • 本章任务:运行 lst-seaborn-chartslst-heatmap-correlation,实际绘制箱线图和相关热力图。
  • 完成后你将得到:箱线图、五数概括、相关矩阵与热力图。
  • 自我检查:用quantile复算箱体并用corr复算一格;空组、常量列或样本不足时先检查原因。
  • 拓展练习:把箱线图与热力图拓展应用到另一中国业务分组。

本章概览

  • 数据可视化:将抽象数据转换为图形表示的过程
  • 核心价值:模式发现、沟通工具、决策支持
  • Python可视化生态:Matplotlib + Seaborn + Pandas

为什么需要数据可视化?

  • 模式发现:人类视觉系统对模式和异常的识别能力远强于对数字表格的扫描
  • 沟通工具:一张精心设计的图表往往比千言万语更能传达数据洞察
  • 决策支持:可视化帮助决策者快速理解数据趋势,做出更明智的商业决策

可视化的本质:数据到图形的映射

  • 数据属性(数值、类别、时间)映射到视觉通道(位置、长度、颜色、形状)
  • 有效的可视化应遵循可视化曼哈顿原则:单位面积内编码尽可能多的信息,同时保持可读性

Python可视化工具栈

定位 特点
Matplotlib 底层绘图库 提供完整的控制能力
Seaborn 高级统计可视化 基于Matplotlib,专为统计图表设计
Pandas 快速绘图 .plot() 方法,一行代码出图

基础图表:折线图与柱状图

  • 折线图:展示数据的时间趋势和变化规律
  • 柱状图:比较不同类别之间的数据差异
  • 这是金融分析中最常用的两种图表类型

代码演示:折线图与柱状图

展开完整代码
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns

# 设置中文字体支持
plt.rcParams['font.sans-serif'] = ['Source Han Serif SC']

# 准备示例数据:公司5个月的销售额和利润
sales = pd.DataFrame({
    '月份': ['1月', '2月', '3月', '4月', '5月'],
    '销售额': [120, 150, 180, 140, 200],
    '利润': [30, 40, 50, 35, 60]
})

plt.figure(figsize=(12, 4.2))

# 折线图
plt.subplot(1, 2, 1)
plt.plot(sales['月份'], sales['销售额'], marker='o', linewidth=2)
plt.title('销售额趋势', fontsize=16)
plt.xlabel('月份', fontsize=16)
plt.ylabel('销售额(万元)', fontsize=16)
plt.grid(True, alpha=0.3)

# 柱状图
plt.subplot(1, 2, 2)
plt.bar(sales['月份'], sales['利润'], color='steelblue', alpha=0.7)
plt.title('利润对比', fontsize=16)
plt.xlabel('月份', fontsize=16)
plt.ylabel('利润(万元)', fontsize=16)
plt.grid(axis='y', alpha=0.3)

plt.tight_layout()
plt.show()
Listing 1: 基础图表绘制示例:折线图与柱状图
图中展示基础图表绘制示例:折线图与柱状图;读者应依据坐标、图例与注释比较主要模式。

折线图关键参数解析

参数 含义 示例
marker 数据点标记形状 'o'(圆形), 's'(方形)
linewidth 线条宽度 2
alpha 透明度(0~1) 0.7
color 线条颜色 'steelblue'

柱状图关键参数解析

参数 含义 示例
color 柱子颜色 'steelblue'
alpha 透明度 0.7
grid(axis='y') 只显示Y轴网格 便于对比柱高

Seaborn高级统计图表

  • Seaborn 在 Matplotlib 基础上提供更高级的统计可视化
  • 特别适合展示数据的分布特征统计关系
  • 常用图表:箱线图、小提琴图

代码演示:箱线图与小提琴图

展开实现代码
import seaborn as sns

plt.figure(figsize=(12, 4.2))

# 箱线图
plt.subplot(1, 2, 1)
sns.boxplot(data=sales, x='月份', y='销售额')
plt.title('销售额箱线图', fontsize=16)

# 小提琴图
plt.subplot(1, 2, 2)
sns.violinplot(data=sales, x='月份', y='销售额')
plt.title('销售额小提琴图', fontsize=16)

plt.tight_layout()
plt.show()
Listing 2: Seaborn高级统计图表:箱线图与小提琴图
图中展示Seaborn高级统计图表:箱线图与小提琴图;读者应依据坐标、图例与注释比较主要模式。

箱线图如何解读?

  • 箱体:包含中间50%的数据(Q1到Q3)
  • 箱中横线:中位数
  • 上下须:数据的正常范围(非异常值)
  • 圆点:异常值(超出1.5倍IQR)

小提琴图如何解读?

  • 宽度:表示该位置数据点的密度
  • 较宽部分:数据更集中
  • 内部:包含箱线图元素,显示统计量
  • 结合了箱线图和核密度估计图的优势

散点图与回归分析

  • 散点图:探索两个数值变量之间关系的经典工具
  • 金融中广泛用于:股票价格与成交量、风险与收益等关系研究
  • 可添加回归线量化线性趋势

代码演示:散点图与回归线

展开实现代码
import numpy as np

# 模拟两个相关的金融变量(如风险与收益)
x = np.random.randn(100) * 10 + 50
y = x * 0.8 + np.random.randn(100) * 5 + 30

plt.figure(figsize=(10, 4.2))

# Seaborn自动拟合OLS回归线并绘制置信区间
sns.regplot(x=x, y=y, scatter_kws={'alpha':0.6})

plt.title('散点图与回归线', fontsize=16)
plt.xlabel('X变量', fontsize=16)
plt.ylabel('Y变量', fontsize=16)
plt.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()
Listing 3: 散点图与回归线
图中展示散点图与回归线;读者应依据坐标、图例与注释比较主要模式。

散点图解读要点

  • 每个点:代表一个观测样本
  • 回归线:显示x和y的整体线性趋势
  • 阴影区域:回归线的置信区间(不确定性范围)
  • sns.regplot() 自动完成OLS最小二乘拟合

相关性热力图

  • 热力图:用颜色编码矩阵元素值的可视化方法
  • 最适合展示相关性矩阵
  • 一目了然地看出哪些变量存在强相关关系

Pearson相关系数回顾

  • 取值范围:\([-1, 1]\)
  • \(1\):完全正相关
  • \(0\):无线性相关
  • \(-1\):完全负相关

代码演示:相关性热力图

展开完整代码
# 准备示例数据
data = pd.DataFrame({
    'A': [1, 2, 3, 4, 5],
    'B': [5, 4, 3, 2, 1],
    'C': [2, 3, 4, 5, 6],
    'D': [4, 5, 6, 7, 8]
})

# 计算Pearson相关系数矩阵
corr = data.corr()

plt.figure(figsize=(10, 4.2))

# 绘制热力图
sns.heatmap(
    corr,
    annot=True,
    cmap='coolwarm',
    center=0,
    linewidths=0.5,
    cbar_kws={'label': '相关系数'}
)

plt.title('特征相关性热力图', fontsize=16)
plt.tight_layout()
plt.show()
Listing 4: 相关性热力图
图中展示相关性热力图;读者应依据坐标、图例与注释比较主要模式。

热力图解读要点

  • 颜色越红:正相关越强(接近1)
  • 颜色越蓝:负相关越强(接近-1)
  • 颜色接近白色:相关性较弱(接近0)
  • 对角线通常为1:仅当变量方差非零且有足够有效配对观测;常量列或无有效样本会得到 NaN

热力图关键参数

参数 含义
annot=True 在格子中显示数值
cmap='coolwarm' 蓝-红配色(冷-暖色)
center=0 0值为中间色
linewidths=0.5 格子间线宽

运行前预测|平台任务解答代码

  • 输入预测:运行前先写出 turnovervolumeprice 的业务含义、数据类型或取值范围,并判断哪一个输入最可能改变结果。
  • 结果预测:不展开答案,先预测将得到price 的结果;同时写出方向、数量级或表格/图形结构。
  • 完成要求:能独立说明本任务从输入到“平台任务解答代码”结果的关键步骤,原样录入平台代码并得到可核对的运行结果。

⭐ 平台任务解答代码

展开完整代码(投影默认折叠)
# ⚠️ 平台原始代码 - 请原样输入至教学平台(注释除外),平台才会判定答案正确
#任务一
import matplotlib.pyplot as plt
import pandas as pd  # 导入Pandas数据分析库

plt.rcParams["font.sans-serif"] = ["SimHei"]  # 设置Matplotlib全局参数
turnover = pd.read_excel("https://huoran.oss-cn-shenzhen.aliyuncs.com/1726219804739.xlsx",sheet_name="Sheet1")  #导入外部换手率数据并且是Sheet1工作表
turnover["日期"] = pd.to_datetime(turnover["日期"] , format='%Y%m%d')  # 转换为日期时间格式
turnover.set_index("日期",inplace=True)  # 将日期列设为turnover数据框的索引
turnover.head() #显示前五行
turnover.tail() #显示后五行
# 绘制换手率的折线图(显示时间趋势)
turnover.plot(kind="line",figsize=(9,6),title="2024年1月至2024年8月上证50指数换手率",grid=True,fontsize=13)
plt.savefig("1.png")  # 保存图形至文件

#任务二
import matplotlib.pyplot as plt
import pandas as pd  # 导入Pandas数据分析库
plt.rcParams["font.sans-serif"] = ["SimHei"]  # 设置Matplotlib全局参数

# 从Excel文件读取数据存入volume
volume = pd.read_excel("https://huoran.oss-cn-shenzhen.aliyuncs.com/1726219804739.xlsx",sheet_name="Sheet2",header=0)  

volume["日期"] = pd.to_datetime(volume["日期"] , format='%Y%m%d')  # 转换为日期时间格式
volume.set_index("日期",inplace=True)  # 将日期列设为volume数据框的索引
# 绘制交易金额的直方图(展示分布特征)
volume.plot(kind="hist",figsize=(9,6),title="2024年1月至2024年9月上证50指数交易金额",grid=True,fontsize=13)
plt.savefig("1.png")  # 保存图形至文件


#任务三
import matplotlib.pyplot as plt
import pandas as pd  # 导入Pandas数据分析库
plt.rcParams["font.sans-serif"] = ["SimHei"]  # 设置Matplotlib全局参数

# 从Excel文件读取数据存入volume
volume = pd.read_excel("https://huoran.oss-cn-shenzhen.aliyuncs.com/1726219804739.xlsx",sheet_name="Sheet2",header=0) 
volume["日期"] = pd.to_datetime(volume["日期"] , format='%Y%m%d')  # 转换为日期时间格式
volume.set_index("日期",inplace=True)  # 将日期列设为volume数据框的索引
volume.describe() #查看数据属性
# 绘制交易金额的箱线图(展示分位数和异常值)
volume.plot(kind="box",figsize=(9,6),title="2024年1月至2024年9月上证50指数交易金额",grid=True,fontsize=13)
plt.savefig("1.png")  # 保存图形至文件

#任务四
import matplotlib.pyplot as plt
import pandas as pd  # 导入Pandas数据分析库
plt.rcParams["font.sans-serif"] = ["SimHei"]  # 设置Matplotlib全局参数

# 从Excel文件读取数据存入price
price = pd.read_excel("https://huoran.oss-cn-shenzhen.aliyuncs.com/1726219804739.xlsx",sheet_name="Sheet3")
price ["日期"] = pd.to_datetime(price["日期"] , format='%Y%m%d')  # 转换为日期时间格式
price.set_index("日期",inplace=True)  # 将日期列设为price数据框的索引
price.head()  # 查看price前5行数据
price.tail()  # 查看price后5行数据
price.plot(kind="line",subplots=True,sharex=True,sharey=True,layout=(2,2),figsize=(10,8),title="2024年1月至2024年9月上证50指数走势图",grid=True,fontsize=13) #2018年1月至2019年6月上证50指数走势图
plt.savefig("1.png")  # 保存图形至文件

任务复盘|平台任务解答代码

运行后核对:核对 turnovervolumeprice 是否按预测参与运算,实际输出是否与预测一致;若不一致,先检查类型、单位、索引/字段和运算顺序。

拓展练习:把数据替换为一个中国企业或市场序列,改变一个分组或时间窗口;说明图形结论是否改变,以及为何。

本章小结

  • 折线图:展示时间趋势,用 plt.plot()df.plot(kind='line')
  • 柱状图:类别比较,用 plt.bar()
  • 箱线图/小提琴图:数据分布,用 sns.boxplot() / sns.violinplot()
  • 散点图+回归线:变量关系,用 sns.regplot()
  • 热力图:相关性矩阵,用 sns.heatmap()

随堂练习

  • 问题 1|需要准备哪些数据?:含类别、连续指标和相关变量的DataFrame。
  • 问题 2|需要完成哪些操作?:运行 lst-seaborn-chartslst-heatmap-correlation,实际绘制箱线图和相关热力图。
  • 问题 3|应得到哪些结果?:箱线图、五数概括、相关矩阵与热力图。
  • 问题 4|怎样确认结果可靠?:用quantile复算箱体并用corr复算一格;空组、常量列或样本不足时先检查原因。
  • 问题 5|换一个情境,怎样继续应用?:把箱线图与热力图拓展应用到另一中国业务分组。
  • 作答提示:请依次写清所用数据、分析过程、所得结果、核对方法和拓展思考。课程所需数据见前言中的下载入口;教学平台固定题按页面说明完成。

教师参考解答|答案与说明 1

  • 所用数据与字段:三列有限收益率、相同日期索引;图题、单位、来源/示例数据身份齐全。

教师参考解答|代码 1

展开代码(代码区可独立滚动)
import pandas as pd, seaborn as sns, matplotlib.pyplot as plt  # 导入表格工具以构造、对齐和核对数据
returns=pd.DataFrame({'A':[.01,.02,-.01,.03],'B':[0,.01,-.02,.02],'C':[.03,.02,.01,0]})  # 建立确定性收益输入
quartiles=returns.quantile([.25,.5,.75]); corr=returns.corr(min_periods=3)  # 建立确定性收益输入
fig,axes=plt.subplots(1,2,figsize=(9,3.4))  # 设置图形编码、坐标或布局以匹配数据口径
sns.boxplot(data=returns,ax=axes[0]); sns.heatmap(corr,annot=True,vmin=-1,vmax=1,ax=axes[1])  # 建立确定性收益输入
plt.tight_layout(); plt.show()  # 设置图形编码、坐标或布局以匹配数据口径
assert corr.shape==(3,3) and quartiles.loc[.5].equals(returns.median())  # 建立确定性收益输入

教师参考解答|答案与说明 2

  • 解释答案:箱线图回答分布位置与离散程度,热力图回答指定样本和最少观测口径下的成对相关;图形不能代替分位数和矩阵数值。
  • 拓展应用答案:拓展应用到行业收益面板时,替换列名与同一时间段的收益,写出箱线图、相关矩阵和中位数核对,并标注缺失处理规则。
  • 参考结果:箱线图、限定到[-1,1]的相关热力图与四分位表。另行核对:手算一列中位数;加入常量列应看到相关为NaN。
  • 常见错误:颜色当唯一编码;相关写成因果;把对角线无条件宣称为1。